#include"Register.h"


void Menu() {
    Color(12);
    printf("************          用户注册及登录         *************\n");
    Color(15);
    printf("********      1.注册新账户       2.登录账户       ********\n");
    printf("********      3.修改账户密码     4.账户删除       ********\n");
    printf("********      5.显示已注册用户   6.找回密码       ********\n");
    printf("***************          0.退出               ************\n");
    printf("***      注意：账户删除功能需要管理员权限才能操作      ***\n");

    return;
}

//颜色设置
void Color(int color){
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color);
}
//创建文件（register.txt）
void Create_File()
{
    FILE* fp;
    fp = fopen("register.txt", "rb+");
    if(!fp){
        fp = fopen("register.txt", "wb+");
        if (!fp) {
            perror("open file error");
            assert(1);
        }
    }

    //管理员
    Register admin;
    strcpy(admin.user_account, ADMINACCOUNT);
    strcpy(admin.user_password, ADDMINPASSWORD);
    strcpy(admin.user_name, "Admin");
    strcpy(admin.user_cell_number, "00000000000");

    fwrite(&admin, 1, sizeof(Register), fp);
    fclose(fp);
    return;
}

void JudgeUser(Register* write_file_in, int way) {
    int flag;//一个判断标志
    int count = 0;
    switch (way) {
        //账号合法性判断
    case 1:
        flag = 1;//一个判断标志

        //检验位数和构成
        while (1) {
            if (count)
                scanf("%s", write_file_in->user_account);
            //账号规定（8~16位，必须由数字构成）
            if (strlen(write_file_in->user_account) >= 8 && strlen(write_file_in->user_account) <= 16) {
                char* judge = write_file_in->user_account;
                while (*judge) {
                    if (!isdigit(*judge)) {
                        printf("账号必须由数字构成，请重新输入>>");
                        count = 1;
                        flag = 0;
                        judge++;
                        break;
                    }
                    judge++;
                }
                if (flag)
                    break;
            }
            else {
                count = 1;
                printf("账号位数不对，请重新输入>>");
            }
        }
        break;//case对应的

    //密码合法性判断
    case 2:  
        flag = 1;//一个判断标志
        count = 0;
        //检验位数和构成
        while (1) {
            if (count)
                scanf("%s", write_file_in->user_password);
            //账号规定（6~12位，必须由数字/大写字母/小写字母构成）
            if (strlen(write_file_in->user_password) >= 6 && strlen(write_file_in->user_password) <= 12) {
                char* judge = write_file_in->user_password;
                while (*judge) {
                    if (!isdigit(*judge) && !islower(*judge) && !isupper(*judge)) {
                        printf("密码必须由数字/大写字母/小写字母构成，请重新输入\n>>");
                        flag = 0;
                        count = 1;
                        judge++;
                        break;
                    }
                    judge++;
                }
                if (flag)
                    break;
            }
            else {
                count =1;
                printf("密码位数不对，请重新输入\n>>");
            }
        }
        break;//case对应的
    default:
        break;
    }
    return;
}

//用户名重复检查
void JudgeUsesName(Register* write_file_in, FILE* fp) {
    Register temp;//用来存放文件中的数据
    int flag = 1;
    int count = 0;
    while (1) {
        flag = 1;
        if (count) {
            scanf("%s", write_file_in->user_name);
        }
        rewind(fp);
        while (fread(&temp, 1, sizeof(Register), fp)) {
            if (!strcmp(temp.user_name, write_file_in->user_name)) {
                printf("该用户名已存在，请重新输入\n");
                flag = 0;
                count = 1;
                break;
            }
        }
        if (flag)
            break;
    }
}
//手机号合法性检验
void JudgeUserCellNumber(char cell_num[]) {
    char* cur = cell_num;
    int flag = 1;
    int count = 0;
    while (1) {
        flag = 1;
        if (count)
            scanf("%s", cell_num);
        if (11 == strlen(cell_num)) {
            while (*cur) {
                //失败返回0
                if (!isdigit(*cur)) {
                    flag = 0;//非法
                    count = 1;
                    printf("手机号输入非法，注意只能由数字构成,请重新输入\n");
                    break;
                }
                cur++;
            }
            if (flag)
                break;
        }
        else{
            printf("手机位数错误，请重新输入\n");
            count = 1;
        }
    }
    return;
}
//手机号绑定
void BindNumber(Register* write_file_in, FILE* fp) {
    printf("请输入要绑定的手机号(11位)\n>>");
    char cell_num[20] = { 0 };
    scanf("%s", cell_num);
    JudgeUserCellNumber(cell_num);//手机号合法性检验
    strcpy(write_file_in->user_cell_number, cell_num);
    return;
}
//注册账号
void Registers(){
    Register write_file_in, put_in;
    FILE* fp;
    char tmp[20];//密码确认
    int count = 0;
    int flag = 1;//一个判断标志
    printf("欢迎来到注册界面！\n");
    Sleep(1000);
    fp = fopen("register.txt", "rb+");
    if (!fp) {
        perror("file open error:");
        assert(1);
    }
    while (1) {
        flag = 1;
        printf("请输入账号(8~16位，只能由数字构成)>>");
        scanf("%s", write_file_in.user_account);
        //账号合法性检验
        JudgeUser(&write_file_in, 1);
        rewind(fp);
        while (fread(&put_in, 1, sizeof(Register), fp)) {
            //进入循环，说明没有读取完毕
            if (!strcmp(write_file_in.user_account, put_in.user_account)) {
                //进入if，说明账号已存在
                printf("账号已经存在，请重新输入\n");
                Sleep(500);
                flag = 0;
                break;
            }
        }
        if (flag)
            break;
    }
  
    //对其它信息进行处理
    while (1) {
        printf("请设置密码(长度为6~12,且必须由大小写字母和数字(不一定全包括)组成)>>");
        scanf("%s", &write_file_in.user_password);
        //密码合法性检查
        JudgeUser(&write_file_in, 2);
        printf("请再次确认密码 -------------------------------------------------->>");
        scanf("%s", tmp);
        if (!strcmp(tmp, write_file_in.user_password)) {
            //进入循环，相等
            break;
        }
        else 
            printf("两次密码输入不相同，请重新输入\n");
    }


    
    printf("请设置用户名>>");
    scanf("%s", write_file_in.user_name);
    //用户名是否重复检查
    JudgeUsesName(&write_file_in, fp);

    //电话初始化均为"00000000000"-->11位（不算'\0'）
    strcpy(write_file_in.user_cell_number, "00000000000");

    //请选择是否要绑定电话
    printf("请选择是否要绑定电话（便于找回密码）  1. 绑定   0.不绑定\n");
    int select = 1;
    while (select) {
        scanf("%d", &select);
        if (1 == select) {
            BindNumber(&write_file_in, fp);
            break;
        }
        else if (!select) {
            printf("不进行绑定\n");
            break;
        }
        else 
            printf("选择错误，请重新选择>>");
    }

    fwrite(&write_file_in, 1, sizeof(Register), fp);//注册信息写入文件
    printf(" %s 用户注册成功\n", write_file_in.user_name);

    fclose(fp);//文件主要用于比较账号是否已经被注册，比较完毕后关闭文件

}

//登录系统
void Input_login(){
    Register log, put_in;
    FILE* fp = fopen("register.txt", "rb+");
    if (!fp) {
        perror("file open error:");
        assert(1);
    }
    printf("欢迎来到登录界面！\n");
    Sleep(1000);
    int flag = 0;
    while (1) {
        flag = 0;
        printf("请输入账号>>");
        scanf("%s", log.user_account);
        printf("请输入密码>>");
        scanf("%s", log.user_password);
        rewind(fp);
        while (fread(&put_in, 1, sizeof(Register), fp)) {
            //进入循环，表示未读取完毕
            if (!strcmp(log.user_account, put_in.user_account)) {
                //进入循环，账号输入正确
                if (!strcmp(log.user_password, put_in.user_password)) {
                    if (!strcmp(log.user_password, ADDMINPASSWORD)) {
                        printf("(admin)管理员登录成功！！！\n");
                        admin_flag = 1;
                    }
                    else
                        printf("%s 登录成功！\n", put_in.user_name);
                    flag = 1;
                    break;
                }
            }
        }
        if (flag)
            break;
        else
            printf("账号或密码错误，请重新登录\n");
    }
    fclose(fp);
}

//修改密码
void ModifyPassword(){
    Register temp, put_in, write_file_in;
    int flag = 0;
    FILE* fp = fopen("register.txt", "rb+");
    if(!fp){
        perror("file open error:");
        assert(1);
    }
    while (1) {
        flag = 0;
        printf("请输入账号>>");
        scanf("%s", put_in.user_account);
        printf("请输入原密码>>");
        scanf("%s", put_in.user_password);
        rewind(fp);
        
        while (fread(&temp, 1, sizeof(Register), fp)) {
            if (!strcmp(temp.user_account, put_in.user_account) && !strcmp(temp.user_password, put_in.user_password)) {
                //存在该账户
                while (1) {
                    printf("请输入修改后的密码>>");
                    scanf("%s", write_file_in.user_password);
                    JudgeUser(&write_file_in, 2);
                    //用修改后的密码来替换原密码
                    if (!strcmp(write_file_in.user_password, put_in.user_password)) {
                        printf("与原密码相同,请重新输入修改后的密码\n");
                    }
                    else 
                        break;
                }
                strcpy(temp.user_password, write_file_in.user_password);
                //将该结构体重新写入文件
                int sz = sizeof(Register);
                //成功返回0

                if (fseek(fp, -1 * sz, SEEK_CUR)) {
                    perror("偏移失败:");
                    assert(1);
                }

                fwrite(&temp, 1, sizeof(Register), fp);
                printf("密码修改成功\n");
                fclose(fp);
                flag = 1;
                break;
            }
        }
        if (flag) 
            break;
        printf("不存在该账户,请重新输入\n");
    }
    return;
}


void Admin_Delete() {
    //管理员权限限制
    if (!admin_flag){
        printf("该操作需要管理员权限，请进行登录后再操作\n");
        return;
    }
    int flag_user = 0;//账号密码检验标志
    int flag_admin = 1;//管理员删除标志
    FILE* fp = fopen("register.txt", "rb+");
    FILE* temp_fp = fopen("temp_register.txt", "w+");//创建一个临时文件
    if (!fp || !temp_fp) {
        perror("FILE open error:");
        assert(1);
    }
    Register delete, temp;
    while (1) {
        flag_user = 0;
        flag_admin = 1;
        printf("请输入要删除的账号>>");
        scanf("%s", delete.user_account);
        printf("请输入要删除的密码>>");
        scanf("%s", delete.user_password);
        if (!strcmp(delete.user_account, ADMINACCOUNT) && !strcmp(delete.user_password, ADDMINPASSWORD)) {
            printf("管理员不可删除,请重新输入\n");
            flag_admin = 0;
        }
        rewind(fp);
        //要删除管理员不可进入while
        while (flag_admin && fread(&temp, 1, sizeof(Register), fp)) {
            if (!strcmp(delete.user_account, temp.user_account) && !strcmp(delete.user_password, temp.user_password))
                flag_user = 1;//账户正确则标志1（有账户对应）
        }
        rewind(fp);
         //要删除管理员不可进入while
        while (flag_admin && flag_user && fread(&temp, 1, sizeof(Register), fp)) {
            if (!(!strcmp(delete.user_account, temp.user_account) && !strcmp(delete.user_password, temp.user_password)))
                fwrite(&temp, 1, sizeof(Register), temp_fp);//进入循环的不需要删除,写入临时文件
        }

        if (flag_admin && !flag_user)//账号输入错误
            printf("账号或密码输入错误，请重新输入\n");
        else if(flag_user && flag_admin)
            break;
    }
    //关闭文件
    fclose(fp);
    fclose(temp_fp);
    //删除原文件,成功返回0
    if (remove("register.txt")) {
        perror("delete file error:");
        assert(1);
   }
    //重命名,成功返回0
    if (rename("temp_register.txt", "register.txt")) {
        perror("rename file error:");
        assert(1);
    }
    printf("删除成功\n");
}


//显示已注册用户
void ShowAllUser() {
    Register temp;//用来接收从文件中的读取信息
    FILE* fp = fopen("register.txt", "rb+");
    if (!fp) {
        perror("FILE open error:");
        assert(1);
    }
    rewind(fp);
    Color(12);
    printf("用户名\t\t\t账号\t\t\t手机号\n");
    Color(14);
    while (fread(&temp, 1, sizeof(Register), fp))
        printf("%-20s%-23s%-23s\n", temp.user_name, temp.user_account, temp.user_cell_number);
    fclose(fp);
    system("pause>nul");//任意键继续
    return;
}

//找回密码
void FindPassword() {
    printf("欢迎来到找回密码界面！\n");
    Register find, temp;
    int flag = 0;//账户是否存在
    int flag_bind = 1;//是否已经绑定手机
    int flag_admin = 0;//是否为管理员账户
    FILE* fp = fopen("register.txt", "rb+");
    if (!fp) {
        perror("FILE open error:");
        assert(1);
    }
    while (1) {
        flag = 0;
        printf("请输入账号>>");
        scanf("%s", find.user_account);
        rewind(fp);
        while (fread(&temp, 1, sizeof(Register), fp)) {
            if (!strcmp(find.user_account, temp.user_account)) {
               //存在
                flag = 1;
                if (!strcmp(temp.user_cell_number, ADMINACCOUNT)) {
                    //管理员账户
                    flag_admin = 1;
                    printf("该用户为管理员，无法进行密码找回\n");
                    break;
                }
                if (!strcmp(temp.user_cell_number, "00000000000")){
                    printf("该用户未（%s）绑定手机,无法找回\n", temp.user_name);
                    flag_bind = 0;
                    break;
                }
                printf("请输入绑定手机>>");
                scanf("%s", find.user_cell_number);
                if (!strcmp(find.user_cell_number, temp.user_cell_number)) {
                    printf("该用户密码为>>%s", temp.user_password);
                    break;
                }

            }
        }
        if (!flag)//不存在
            printf("不存在该账户，请重新输入\n");
        else
            break;
        //else if (flag_admin) //管理员
        //    break;
        //else if (!flag_bind)//账号存在不是管理员，但未绑定手机
        //    break;
        //else
        //    break;
    }
    fclose(fp);
    system("pause>nul");
    return;
}
